package com.bprogram.config;


import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;


@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全过滤器
        bean.setSecurityManager(defaultWebSecurityManager);
        //自己的过滤器
        Map<String, Filter> filterMap = new HashMap<>();
        filterMap.put("jwt", new JWTFilter());
        bean.setFilters(filterMap);

        /**
         * anon:所有人都可以进
         * authc：认证了才可以访问
         * user：有记住我功能才可以使用
         * perms：拥有某个资源权限才可以访问
         * role：有某个角色权限才可以访问
         */
        Map<String, String> filtermap = new LinkedHashMap<>();
        filtermap.put("/user/register", "anon");
        filtermap.put("/user/registerCode", "anon");
        filtermap.put("/user/login", "anon");
        filtermap.put("/user/noauth", "anon");
        filtermap.put("/user/findPwd/**", "anon");
        filtermap.put("/video/getPageVideo", "anon");



        //权限配置
        // 若是自定义了过滤器，那么需要加上jwt,perms[super]自己的，若是用shiro原生的则perms[super]就可以了
        filtermap.put("/partion/saveOrUpdatePartion","jwt,perms[super]");
        filtermap.put("/partion/delete","jwt,perms[super]");

        filtermap.put("/user/delete","jwt,perms[super]");
        //其他请求需要通过我们自定义的过滤器
        filtermap.put("/**", "jwt");
        System.out.println("将要n进去授权");
        //设置未登录访问其他页面后跳转的页面
        bean.setUnauthorizedUrl("/user/noauth");

        //设置登录页面未设置则跳转到Shiro自带的登录页面
//        bean.setLoginUrl("/user/login");


        bean.setFilterChainDefinitionMap(filtermap);

        /**
         * 设置未授权跳转页面
         */
        bean.setUnauthorizedUrl("/noauth");
        return bean;
    }

    //securityMagger管理器
    //@Qualifier("userRealm"):这里的userRealm既是自己定义realm的方法名
    @Bean("securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //realm需要自己定义
    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }


}
